package database

import (
	"admin-glm-go/internal/config"
	"admin-glm-go/internal/models"
	"log"
	"strings"

	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gorm.io/gorm/logger"
	"gorm.io/gorm/schema"
)

// DB 全局数据库连接实例
var DB *gorm.DB

// InitDB 初始化数据库连接
func InitDB(cfg *config.Config) (*gorm.DB, error) {
	dsn := cfg.GetDSN()
	
	// 连接数据库
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
		Logger: logger.Default.LogMode(logger.Info),
		NamingStrategy: schema.NamingStrategy{
			SingularTable: true, // 使用单数表名
		},
	})
	if err != nil {
		return nil, err
	}

	// 设置连接池
	sqlDB, err := db.DB()
	if err != nil {
		return nil, err
	}

	// 设置连接池参数
	sqlDB.SetMaxIdleConns(10)   // 空闲连接池中的最大连接数
	sqlDB.SetMaxOpenConns(100)  // 数据库的最大打开连接数

	// 保存全局数据库连接实例
	DB = db

	log.Println("数据库连接成功")
	
	// 执行数据库迁移
	if err := models.AutoMigrate(db); err != nil {
		// 检查是否是外键不存在的错误，如果是则忽略并继续执行
		if strings.Contains(err.Error(), "Can't DROP") && strings.Contains(err.Error(), "check that column/key exists") {
			log.Println("警告: 尝试删除不存在的外键，已忽略此错误")
		} else if strings.Contains(err.Error(), "Error 1091") {
			log.Println("警告: 尝试删除不存在的外键，已忽略此错误")
		} else {
			log.Fatalf("数据库迁移失败: %v", err)
			return nil, err
		}
	}
	log.Println("数据库迁移成功")
	
	// 初始化基础数据
	if err := models.InitBasicData(db); err != nil {
		log.Fatalf("初始化基础数据失败: %v", err)
		return nil, err
	}
	log.Println("初始化基础数据成功")
	
	return db, nil
}

// GetDB 获取数据库连接实例
func GetDB() *gorm.DB {
	return DB
}